package mybox.engine;

public class Platte implements Figur{
	
	public static final String FF = "FF";
	public static final String FFX = "FFX";
	public static final String MF = "MF";
	public static final String MXF = "MXF";
	public static final String MFL = "MFL";
	public static final String MMR = "MMR";
	public static final String MMRL = "MMRL";
	
	File4Qcad file4qcad ;		
	QVector aktPos ;
	
	double laenge;
	public double breite;
	double materialDicke;
	double zinkungsFaktor;
	double xLaenge;
	double laserBreite;
	String type;
	
	public QVector[] ecke = new QVector[4];
	
	boolean[] randIsGlatt = new boolean[4];
	RandLinie[] randLinie = new RandLinie[4];
	
	public QVector center;
	
	public Platte(File4Qcad file4qcad, 
			QVector aktPos,
			String type,
			double laenge,
			double breite,			
			double materialDicke,
			double zinkungsFaktor,
			double laserBreite,
			boolean[] randIsGlatt) {
		
		init(file4qcad, 
				 aktPos,
			     type,
			     laenge,
				 breite,	
				 0,
			     materialDicke,
			     zinkungsFaktor,
				 laserBreite,
				 randIsGlatt);
		
		
	}
		
	public Platte(File4Qcad file4qcad, 
			QVector aktPos,
			String type,
			double laenge,
			double breite,			
			double materialDicke,
			double zinkungsFaktor,
			double laserBreite	) {
		init(file4qcad, 
			 aktPos,
		     type,
		     laenge,
			 breite,	
			 0,
		     materialDicke,
		     zinkungsFaktor,
			 laserBreite,
			 null);		
	}
	
	public Platte(
			File4Qcad file4qcad, 
			QVector aktPos,
			String type,
			double laenge,
			double breite,
			double xLaenge,
			double materialDicke,
			double zinkungsFaktor,
			double laserBreite			
			) {
		init(file4qcad, 
				 aktPos,
			     type,
			     laenge,
				 breite,	
				 xLaenge,
			     materialDicke,
			     zinkungsFaktor,
				 laserBreite,
				 null);
					
	}
	
	public void init(File4Qcad file4qcad, 
			QVector aktPos,
			String type,
			double laenge,
			double breite,
			double xLaenge,
			double materialDicke,
			double zinkungsFaktor,
			double laserBreite,		
			boolean[] randIsGlatt) {
		
		this.file4qcad=file4qcad;
		this.aktPos=new QVector(aktPos.x,aktPos.y);
		this.type=type;
		this.laenge=laenge;
		if (type.equalsIgnoreCase(FF)||type.equalsIgnoreCase(FFX))
				this.breite=breite;
		this.xLaenge=xLaenge;
		if (type.equalsIgnoreCase(MF))
		      this.breite=breite-2*(RandLinie.calcZinkenHoehe(materialDicke));
		
		if (type.equalsIgnoreCase(MMR)) {
			this.laenge=laenge-2*(RandLinie.calcZinkenHoehe(materialDicke));
			this.breite=breite;
					}
		
		if (type.equalsIgnoreCase(MXF)) {			
			this.laenge=laenge;
			this.xLaenge=xLaenge;
			this.breite=breite;			
		}
		
		this.materialDicke=materialDicke;
		this.zinkungsFaktor=zinkungsFaktor;
		this.laserBreite=laserBreite;	
		if (randIsGlatt!=null)
			for (int i=0; i<4;i++) this.randIsGlatt[i]=randIsGlatt[i];
		else {
			for (int i=0; i<4;i++) this.randIsGlatt[i]=false; 
		}
		
		setUpRandLinie();
		
	}

	public void setUpRandLinie() {
		
		if (type.equalsIgnoreCase(FF)) {
			ecke[0]= new QVector(aktPos);
			randLinie[0]= new RandLinie (file4qcad, aktPos, RandLinie.F, 0, laenge,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[0]);
			randLinie[0].draw(false);
			ecke[1]= new QVector(randLinie[0].endPoint);
			randLinie[1]= new RandLinie (file4qcad, aktPos, RandLinie.F, java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[1]);
			randLinie[1].draw(false);
			ecke[2]= new QVector(randLinie[1].endPoint);
			randLinie[2] = new RandLinie (file4qcad, aktPos, RandLinie.F, java.lang.Math.PI, laenge,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[2]);
			randLinie[2].draw(false);
			ecke[3]= new QVector(randLinie[2].endPoint);
			randLinie[3] = new RandLinie (file4qcad, aktPos, RandLinie.F, 3*java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[3]);
			randLinie[3].draw(false);
		}
		
		if (type.equalsIgnoreCase(FFX)) {
			ecke[0]= new QVector(aktPos);
			randLinie[0] = new RandLinie (file4qcad, aktPos, RandLinie.F, 0, laenge,materialDicke, zinkungsFaktor, laserBreite);
			randLinie[0].draw(false);
			ecke[1]= new QVector(aktPos);
			randLinie[1] = new RandLinie (file4qcad, aktPos, RandLinie.FX, java.lang.Math.PI/2, breite,xLaenge, materialDicke, laserBreite, RandLinie.ISNOTGLATT);
			randLinie[1].draw(false);
			ecke[2]= new QVector(aktPos);
			randLinie[2] = new RandLinie (file4qcad, aktPos, RandLinie.F, java.lang.Math.PI, laenge,materialDicke, zinkungsFaktor, laserBreite);
			randLinie[2].draw(false);
			ecke[3]= new QVector(aktPos);
			randLinie[3] = new RandLinie (file4qcad, aktPos, RandLinie.F, 3*java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor, laserBreite);
			randLinie[3].draw(false);
			
		}
		
		if (type.equalsIgnoreCase(MXF)) {
			ecke[0]= new QVector(aktPos);
			randLinie[0] = new RandLinie (file4qcad, aktPos, RandLinie.MX, 0, laenge,xLaenge, materialDicke, zinkungsFaktor, laserBreite,RandLinie.ISNOTGLATT);
			randLinie[0].draw(false);
			ecke[1]= new QVector(aktPos);
			randLinie[1] = new RandLinie (file4qcad, aktPos, RandLinie.F, java.lang.Math.PI/2, breite,xLaenge, materialDicke, zinkungsFaktor, laserBreite, RandLinie.ISNOTGLATT);
			randLinie[1].draw(false);
			ecke[2]= new QVector(aktPos);
			randLinie[2] = new RandLinie (file4qcad, aktPos, RandLinie.M, java.lang.Math.PI, laenge, materialDicke, zinkungsFaktor, laserBreite);
			randLinie[2].draw(false);
			ecke[3]= new QVector(aktPos);
			randLinie[3] = new RandLinie (file4qcad, aktPos, RandLinie.F, 3*java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor, laserBreite);
			randLinie[3].draw(false);
			
		}
		
		if (type.equalsIgnoreCase(MF)) {
			ecke[0]= new QVector(aktPos);
			randLinie[0] = new RandLinie (file4qcad, aktPos, RandLinie.M, 0, laenge,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[0]);
			randLinie[0].draw(false);
			ecke[1]= new QVector(aktPos);
			randLinie[1] = new RandLinie (file4qcad, aktPos, RandLinie.F, java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[1]);
			randLinie[1].draw(false);
			ecke[2]= new QVector(aktPos);
			randLinie[2] = new RandLinie (file4qcad, aktPos, RandLinie.M, java.lang.Math.PI, laenge,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[2]);
			randLinie[2].draw(false);
			ecke[3]= new QVector(aktPos);
			randLinie[3] = new RandLinie (file4qcad, aktPos, RandLinie.F, 3*java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor, laserBreite,this.randIsGlatt[3]);
			randLinie[3].draw(false);
		}
		
		if (type.equalsIgnoreCase(MMR)) {
			ecke[0]= new QVector(aktPos);
			randLinie[0] = new RandLinie (file4qcad, aktPos, RandLinie.M, 0, laenge,materialDicke, zinkungsFaktor,laserBreite,this.randIsGlatt[0]);
			randLinie[0].draw(false);
			ecke[1]= new QVector(aktPos);
			randLinie[1] = new RandLinie (file4qcad, aktPos, RandLinie.MR, java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor,laserBreite,this.randIsGlatt[1]);
			randLinie[1].draw(false);
			ecke[2]= new QVector(aktPos);
			randLinie[2] = new RandLinie (file4qcad, aktPos, RandLinie.M, java.lang.Math.PI, laenge,materialDicke, zinkungsFaktor,laserBreite,this.randIsGlatt[2]);
			randLinie[2].draw(false);
			ecke[3]= new QVector(aktPos);
			randLinie[3] = new RandLinie (file4qcad, aktPos, RandLinie.MR, 3*java.lang.Math.PI/2, breite,materialDicke, zinkungsFaktor,laserBreite,this.randIsGlatt[3]);
			randLinie[3].draw(false);
			
		}
					
		center = new QVector((ecke[0].x+ecke[1].x)/2,(ecke[0].y+ecke[3].y)/2);
		
	}
	
	public void draw() {		
		for (int randLinIdx=0;randLinIdx<4;randLinIdx++) randLinie[randLinIdx].draw();		
	}
	
	public void drawCenter(double radius) {
		Circle centerCircle = new Circle(file4qcad,center, radius);
		centerCircle.draw();
	}
	
	public void drawZigZagHoles(double radius, int anzahlZigZags) {
		QVector LL = new QVector(ecke[0].x+materialDicke, ecke[0].y+materialDicke);
		double innenLaenge=laenge-2*materialDicke;
		double innenBreite=breite-2*materialDicke;
		
		for (int lochIdx=0; lochIdx<anzahlZigZags;lochIdx++) {
			double lx = (innenLaenge/anzahlZigZags)*lochIdx+(innenLaenge/(2*anzahlZigZags));
			double ly;
			
			if ((lochIdx%2)==0) {
				ly=3*innenBreite/4;
			} else {
				ly=innenBreite/4;
			}
			Circle zigZagHole = new Circle(file4qcad, new QVector(LL.x+lx,LL.y+ly), radius);
			zigZagHole.draw();
			
		}
				
	}
	
	public void drawJamaica(double vomRandWeg, double jamBreite) {	
		
		double randKorrektur=0;
		if (this.type==MF) randKorrektur=1;
		else			   randKorrektur=2;
		
		QVector untenLinks = new QVector (ecke[0].x+2*vomRandWeg,ecke[0].y+randKorrektur*vomRandWeg);
		
		double laenge=(ecke[1].x-ecke[0].x)-4*vomRandWeg;
		double breite=0;
		
		breite=(ecke[3].y-ecke[0].y)-2*randKorrektur*vomRandWeg;		
		
		Rectangle rectangle = new Rectangle(file4qcad, untenLinks, laenge, breite);		
		rectangle.drawJamaica(jamBreite);
	}
	
	public void drawRectangle(double vomRandWeg) {
		
		QVector untenLinks = new QVector (ecke[0].x+vomRandWeg,ecke[0].y+vomRandWeg);
		double laenge=(ecke[1].x-ecke[0].x)-2*vomRandWeg;
		double breite=(ecke[3].y-ecke[0].y)-2*vomRandWeg;
		Rectangle rectangle = new Rectangle(file4qcad, untenLinks, laenge, breite);		
		rectangle.draw();
		
	}

}
